/*
 * tvectorporo.h
 *
 *  Created on: 18/11/2009
 *      Author: javier
 */

#ifndef TVECTORPORO_H_
#define TVECTORPORO_H_

#include "tporo.h"
/** \file tvectorporo.h
 *
 * \brief Estructura de la clase TVectorPoro.
 *
 * Definiciones de métodos y atributos de clase TVectorPoro.
 */



/** \brief Clase TVectorPoro.
 *
 * Estructura de la clase TVectorPoro.
 *
 */
class TVectorPoro
{
	friend class TDeapPoro;
	/** \brief Sobrecarga del operador "<<", función amiga.
	 *
	 * Función amiga que se encarga de mostrar por pantalla, en un formato determinado un TVectorPoro que le pasemos.
	 *
	 * \param os Ostream donde guardaremos la informacion que queremos mostrar.
	 * \param v TVectorPoro que queremos mostrar.
	 *
	 * \return La funcion devuelve un ostream&.
	 */
	friend ostream& operator <<(ostream&, const TVectorPoro&);

public:

	/** \brief Constructor por defecto.
	 *
	 * Constructor por defecto que inicializa a 0 los componentes del TVectorPoro.
	 */
	TVectorPoro();

	/** \brief Constructor sobrecargado.
	 *
	 * Constructor sobrecargado que recibe un entero con el que le daremos una dimension al vector.
	 * \param dim Entero que contiene el valor de la dimensión que queremos asignarle al vector.
	 */
	TVectorPoro( const int);

	/** \brief Constructor de copia.
	 *
	 * Constructor de copia de vectores.
	 * \param v TVectorPoro desde el que copiamos al nuevo TVectorPoro.
	 */
	TVectorPoro( const TVectorPoro&);

	/** \brief Destructor de la clase.
	 *
	 * Destructor de la clase, borra la memoria.
	 */
	~TVectorPoro();
	/** \brief Sobrecarga del operador asignacion.
	 *
	 *
	 * Asignamos el contenido del parámetro al objeto que llama al método.
	 * \param v TVectorPoro del cual asignamos.
	 * \return Devuelve un TVectorPoro&.
	 */
	TVectorPoro& operator=( const TVectorPoro&);
	/** \brief Sobrecarga del operador igualdad.
	 *
	 * Devuelve true si los dos TVectorPoro son iguales.
	 * \param v TVectorPoro del cual comprobamos que es igual.
	 * \return Devuelve un bool.
	 */
	bool operator==( const TVectorPoro&);
	/** \brief Sobrecarga del operador desigualdad.
	 *
	 * Devuelve true si los dos TVectorPoro son desiguales.
	 * \param v TVectorPoro del cual comprobamos que es desigual.
	 * \return Devuelve un bool.
	 */
	bool operator!=( const TVectorPoro&);
	/** \brief Sobrecarga del operador corchete derecho.
	 *
	 * Inserta un TPoro en el vector
	 * \param int posicion donde se guarda el TPoro.
	 * \return Devuelve el TPoro introducido.
	 */
	TPoro & operator[](int);
	/** \brief Sobrecarga del operador corchete izquierdo.
	 *
	 * Devuelve un TPoro del vector
	 * \param int posicion donde se encuentra el TPoro.
	 * \return Devuelve el TPoro de la posicion.
	 */
	TPoro operator[](int) const;

	/** \brief Metodo Longitud.
	 *
	 * Devuelve un entero con la longitud del vector, que es su dimension.
	 * \return Devuelve un entero, dimension del vector.
	 */
	int Longitud() const;

	/** \brief Metodo Cantidad.
	 *
	 * Este metodo se encarga de contar los poros del vector que no estan vacios.
	 * \return Devuelve un entero con la cantidad de proos no vacios.
	 */
	int Cantidad() const;

	/** \brief Metodo Redimensionar.
	 *
	 * Este metodo efectúa una redimension del vector, eliminando los componenetes finales si el tamaño que le pasamos es menor que el anterior o creando poros vacios si este es mayor.
	 * \param tam Entero mediante el cual introduciremos el nuevo valor de dimension del vector.
	 * \return Devuelve un bool, indica si se ha redimensionado o no.
	 */
	bool Redimensionar(int);

private:

	/** \brief Entero dimension.
	 *
	 * Contiene el valor del tamaño total del vector TVectorPoro.
	 */
	int dimension;

	/** \brief Puntero a TPoro.
	 *
	 * Con este puntero haremos las veces de vector donde almacenamos TPoro's.
	 */
	TPoro *datos;

	/** \brief TPoro error.
	 *
	 * TPoro creado por si hay alguna situacion de error devolverlo.
	 */
	TPoro error;

};


#endif /* TVECTORPORO_H_ */
